home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / emu / prlink_amiga.lha / prlink-0.8.0a / src / prrfile.asm < prev    next >
Assembly Source File  |  1995-05-12  |  3KB  |  138 lines

  1.     processor 6502
  2.  
  3.     include "jmptab.inc"
  4.  
  5. #if target & pet4001
  6.     include "include/petram34.lib"
  7.     include "include/petrom4.lib"
  8. #endif
  9. #if target & pet3001
  10.     include "include/petram34.lib"
  11.     include "include/petrom3.lib"
  12. #endif
  13. #if target & (c64 | c128 | vic20)
  14.     include "include/cbmrom.lib"
  15. #endif
  16.  
  17.     seg code
  18.     org prutils
  19.  
  20. entry:
  21.     lda #0        ; send ack
  22.     jsr send_switch
  23.  
  24. loop:
  25.     ; read a file protocol:
  26.     ; C=             PC or Amiga
  27.     ; ack (00) ->
  28.     ;             <- <length>filename
  29.     ;             <- device #
  30.     ; st: ok (00) or error (!= 00) ->
  31.     ; <length><chksum>datablock (255 bytes max) ->
  32.     ;             <- ok (80) or again (81) or stop (82)
  33.     ; send same or next block, accordingly
  34.     ; last block has length 0 and no checksum or data.
  35.  
  36.     jsr receive_switch    ; get length of file name
  37.     sta fnlen
  38.     tax        ; test length
  39.     bne noexit
  40.     jmp exit    ; reinstall server and exit.
  41. noexit: lda #<filebuf
  42.     sta fnadr
  43.     lda #>filebuf
  44.     sta fnadr+1
  45.     ldx #0        ; receive file name
  46.     stx status    ; clear ST
  47. fnam:
  48.     jsr receive    ; preserves x but sets y to 0.
  49.     sta filebuf,x
  50.     inx
  51.     cpx fnlen
  52.     bcc fnam
  53.  
  54.     jsr receive    ; receive device number
  55.     sta fa
  56.     lda #0        ; secondary addr always 0 for file read
  57.     sta sa
  58.  
  59. myfileno = 45
  60.     lda #myfileno    ; a hopefully unused file number
  61.     sta la
  62.     jsr open
  63.     lda status    ; now test for ourselves if we must continue
  64.     bne abortst
  65.  
  66.     ldx #myfileno
  67.     jsr chkin
  68.     lda status
  69.     bne abortst
  70.     jsr send_switch ; send 00 ok, going ahead code
  71.  
  72.         ; loop to send blocks from the file
  73. nextblock:
  74.     ldx #0
  75. loop2:    bne loop    ; branch entry point (never branch in actual program)
  76.     stx filebuf    ; clear checksum
  77.     inx
  78. rd:            ; read max 255 bytes from the file
  79.     lda status    ; test ST for EOI on previous byte
  80.     bne eof
  81.     jsr stop    ; test stop key
  82.     beq abortst
  83.     jsr chrin
  84.     sta filebuf,x
  85.     clc        ; add into checksum
  86.     adc filebuf
  87.     sta filebuf
  88.     inx        ; x ranges from 01 to max FF
  89.     bne rd
  90.  
  91. eof:
  92.     dex        ; exclude checksum from count
  93.     stx blklen
  94.             ; now go send the buffer
  95. sameblock:
  96.     lda blklen
  97.     jsr send_switch ; send length
  98.     lda blklen
  99.     beq return3    ; 0 length is special: we're finished.
  100.     lda filebuf    ; checksum
  101.     jsr send
  102.     ldx #0
  103. snd:
  104.     lda filebuf+1,x
  105.     jsr send
  106.     inx
  107.     cpx blklen
  108.     bne snd
  109.             ; wait for go on, repeat, or abort.
  110.     jsr receive_switch
  111.     cmp #$80
  112.     beq nextblock
  113.     cmp #$81
  114.     beq sameblock
  115.     bne return3    ; $82 (or other values) abort
  116.  
  117. abortst:
  118.     jsr send_switch ; send non-zero ST value
  119. return3:
  120.     jsr clrchn
  121.     lda #myfileno
  122.     jsr close
  123.  
  124.     lda #1
  125.     bne loop2    ; branch always
  126.  
  127. endcode = .
  128.  
  129.     seg.u bss
  130.     org endcode
  131.  
  132. blklen:
  133.     ds.b 1        ; save block length
  134. filebuf:
  135.     ds.b 256    ; checksum followed by 255 bytes of file data
  136.  
  137. endbss = .
  138.